#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;        // 模数
long long dp[2][101][101][101]; // 滚动数组，做空间优化
int main() {
  int n, m;
  cin >> n >> m; // 输入棋盘的行数和列数
  // 初始化 dp[0]
  for (int x = 0; x <= m; x++) {
    for (int y = 0; y <= m; y++) {
      if (x + y > m)
        break;            // 超过列数限制
      int z = m - x - y;  // 剩余棋子数量
      dp[0][x][y][z] = 1; // 初始化状态
    }
  }
  // 从 dp[1] 到 dp[n]
  for (int i = 1; i <= n; i++) {
    for (int x = 0; x <= m; x++) {
      for (int y = 0; y <= m; y++) {

        if (x + y > m)
          break;           // 超过列数限制
        int z = m - x - y; // 剩余棋子数量
        // 检查是否满足条件
        if (y + 2 * z > 2 * (n - i))
          continue;
        int cur = i & 1;        // 当前行
        int prev = (i - 1) & 1; // 前一行

        // 分类讨论：

        // 1) 第 i 行用了 0 个 1
        dp[cur][x][y][z] = dp[prev][x][y][z];

        // 2) 第 i 行用了 1 个 1
        if (x)
          dp[cur][x][y][z] += x * dp[prev][x - 1][y + 1][z]; // 从 x 减去 1
        if (y)
          dp[cur][x][y][z] += y * dp[prev][x][y - 1][z + 1]; // 从 y 减去 1

        // 3) 第 i 行用了 2 个 1
        if (x > 1)
          dp[cur][x][y][z] +=
              x * (x - 1) / 2 * dp[prev][x - 2][y + 2][z]; // 从 x 减去 2
        if (y > 1)
          dp[cur][x][y][z] +=
              y * (y - 1) / 2 * dp[prev][x][y - 2][z + 2]; // 从 y 减去 2
        if (x && y)
          dp[cur][x][y][z] +=
              y * x * dp[prev][x - 1][y][z + 1]; // x 和 y 同时减去 1
        dp[cur][x][y][z] %= MOD;                 // 取模
      }
    }
  }
  // 输出结果
  cout << dp[n & 1][m][0][0];
  return 0;
}